package com.binc.testspring.schedule;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

/**

 * Description: @schedule使用方式
  <p>使用 @Scheduled 非常容易，直接创建一个 Spring Boot 项目，并且添加 web 依赖 spring-boot-starter-web，
  <p>项目创建成功后，入口类添加 @EnableScheduling 注解，开启定时任务：</p>

 <p>  定时任务讲解：https://www.cnblogs.com/lenve/p/10728897.html
 <p>  cron表达式讲解：https://blog.csdn.net/gm371200587/article/details/82657935


 */
// binc_read  注意：这里的定时任务时每个两秒、五秒数据内容，实验过后我们将被类从容器中剔除了，让控制台干净点；如果想跑的话，把下一行的注释放开就行了；
//@Component  // 注意别忘了将当前类加入到容器中，否则不跑；
public class MySchedule {

    /**
     * 首先使用 @Scheduled 注解开启一个定时任务。
     *      fixedRate 表示任务执行之间的时间间隔，具体是指两次任务的开始时间间隔，即第二次任务开始时，第一次任务可能还没结束。
     *      fixedDelay 表示任务执行之间的时间间隔，具体是指本次任务结束到下次任务开始之间的时间间隔。
     *      initialDelay 表示首次任务启动的延迟时间。
     * 所有时间的单位都是毫秒。
     *
     * 除了这几个基本属性之外，@Scheduled 注解也支持 cron 表达式，使用 cron 表达式，可以非常丰富的描述定时任务的时间。cron 表达式格式如下：
     * Cron表达式是一个字符串，字符串以5或6个空格隔开，分为6或7个域，每一个域代表一个含义，Cron有如下两种语法格式： (https://blog.csdn.net/gm371200587/article/details/82657935)
     * 　　（1） Seconds Minutes Hours DayofMonth Month DayofWeek  Year
     * 　　（2） Seconds Minutes Hours DayofMonth Month DayofWeek
     *          [秒]     [分]   [小时] [日]        [月]  [周]      [年]
     *            1       2      3     4           5    6        7
     *      这一块需要大家注意的是，月份中的日期和星期可能会起冲突，因此在配置时这两个得有一个是 ?
     */
    // @Scheduled(fixedRate = 2000)
    // public void fixedRate() {
    //     System.out.println("fixedRate>>>"+new Date());
    // }
    // @Scheduled(fixedDelay = 2000)
    // public void fixedDelay() {
    //     System.out.println("fixedDelay>>>"+new Date());
    // }


    /**
     * initialDelay + fixedDelay 就是一个很完美的搭配
     */
    @Scheduled(initialDelay = 2000,fixedDelay = 2000) //
    public void initialDelay() {
        System.out.println("initialDelay>>>"+new Date());
    }

    @Scheduled(cron = "0/5 * * * * *")
    public void cron() {
        System.out.println("每个5秒执行一次的定时任务："+new Date());
    }
}
